package com.annimon.stream.longstreamtests;

import com.annimon.stream.LongStream;
import com.annimon.stream.function.LongBinaryOperator;
import org.junit.Test;
import static com.annimon.stream.test.hamcrest.OptionalLongMatcher.hasValue;
import static com.annimon.stream.test.hamcrest.OptionalLongMatcher.isEmpty;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

public final class ReduceTest {

    @Test
    public void testReduceWithIdentity() {
        long result = LongStream.of(12, -3772, 3039, 19840, 100000)
                .reduce(0L, new LongBinaryOperator() {
                    @Override
                    public long applyAsLong(long left, long right) {
                        return left + right;
                    }
                });
        assertThat(result, is(119119L));
    }

    @Test
    public void testReduceWithIdentityOnEmptyStream() {
        long result = LongStream.empty()
                .reduce(1234567L, new LongBinaryOperator() {
                    @Override
                    public long applyAsLong(long left, long right) {
                        return left + right;
                    }
                });
        assertThat(result, is(1234567L));
    }

    @Test
    public void testReduce() {
        assertThat(LongStream.of(12, -3772, 3039, 19840, 100000)
                .reduce(new LongBinaryOperator() {
                    @Override
                    public long applyAsLong(long left, long right) {
                        return left + right;
                    }
                }), hasValue(119119L));
    }

    @Test
    public void testReduceOnEmptyStream() {
        assertThat(LongStream.empty().reduce(new LongBinaryOperator() {
            @Override
            public long applyAsLong(long left, long right) {
                return left + right;
            }
        }), isEmpty());
    }
}
